/*
 * @author[hansen]
 * @date[创建日期: 2022/7/1 9:01]
 * @version[版本: v1.0]
 * @function[功能简介: 高亮显示的widget]
 */

import 'package:flutter/material.dart';

class HighlightTextWidget extends StatelessWidget {
  ///文本
  final String text;

  ///高亮文本
  final String lightText;

  ///文本style
  final TextStyle textStyle;

  ///高亮文本style
  final TextStyle lightTextStyle;
  final int? maxLines;
  final TextOverflow overflow;
  final TextAlign textAlign;

  const HighlightTextWidget({
    Key? key,
    required this.text,
    required this.lightText,
    this.maxLines,
    this.overflow = TextOverflow.clip,
    this.textAlign = TextAlign.start,
    this.textStyle = const TextStyle(
      color: Color(0xff333333),
      fontSize: 14,
    ),
    this.lightTextStyle = const TextStyle(
      color: Color(0xffC20014),
      fontSize: 14,
    ),
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    if (lightText.isEmpty) {
      return Text(
        text,
        style: textStyle,
      );
    }

    return RichText(
      maxLines: maxLines,
      overflow: overflow,
      textAlign: textAlign,
      text: TextSpan(
        children: getTextSpan(),
      ),
    );
  }

  List<TextSpan> getTextSpan() {
    List<String> arr = lightText.split(" ");

    int len = arr.length;

    for (int i = len - 1; i >= 0; i--) {
      ///移除空白的关键字
      if (arr[i].trim().isEmpty) arr.removeAt(i);
    }
    arr.sort((a, b) => a.length.compareTo(b.length));

    ///使用快速排序，把关键词最多的放到最前面，为了防止有两个关键词有包含关系（比如：’我们‘ ’我们的‘）时，通过split把 ’我们‘和 ’来‘拆分
    return getMultiTextSpan(text, quickSort(arr), 0);
  }

  List<TextSpan> getMultiTextSpan(
      String textContent, List<String> lightTextArr, int index) {
    List<TextSpan> spanList = [];

    List<String> arr =
        textContent.split(RegExp(lightTextArr[index], caseSensitive: false));

    ///分割的数组长度
    int len = arr.length;

    ///关键词长度
    int lightTextLen = lightTextArr[index].length;

    ///关键词下表
    int lightStartIndex = 0;

    for (int i = 0; i < len; i++) {
      String s = arr[i];

      ///除了关键词外的文本下标计数
      lightStartIndex += s.length;

      if (lightTextArr.length == 1 || index == lightTextArr.length - 1) {
        if (s.isNotEmpty) {
          spanList.add(
            TextSpan(
              text: s,
              style: textStyle,
            ),
          );
        }
      } else {
        spanList.addAll(getMultiTextSpan(arr[i], lightTextArr, index + 1));
      }

      ///当前添加的关键词数量小于总的关键词数量
      if (i < arr.length - 1) {
        spanList.add(
          TextSpan(
            text: textContent.substring(lightStartIndex + i * lightTextLen,
                lightStartIndex + (i + 1) * lightTextLen),
            style: lightTextStyle,
          ),
        );
      }
    }

    return spanList;
  }

  ///快速排序
  List<String> quickSort(List<String> list) {
    List<String> newList = [];

    //这是最关键的一点，若数组长度为一或小于一时不做操作直接返回
    if (list.length <= 1) {
      return list;
    }

    int len = (list.length / 2).floor();

    //获取基准数 可以是任意一个 这里取的中间数，并将其在数组中删除掉
    String middle = list.removeAt(len);

    List<String> left = [];
    List<String> right = [];
    //将数组分为左右两个部分，比基准小的放左边大的放右边
    for (String item in list) {
      if (item.length > middle.length) {
        left.add(item);
      } else {
        right.add(item);
      }
    }

    newList.addAll(quickSort(left));
    newList.add(middle);
    newList.addAll(quickSort(right));

    //左右部分用基准数连接起来
    return newList;
  }
}
